package lv.clientedisqueria.view;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;

import lv.clientedisqueria.controller.Controller;
import lv.clientedisqueria.model.Modelo;
import lv.mensajeriadisqueria.idomain.IDomain;

@SuppressWarnings("serial")
public abstract class AbstractPanel<Entity extends IDomain> extends JPanel implements Observer {

	private final Modelo<Entity> modelo;

	public AbstractPanel(Modelo<Entity> modelo) {
		this.modelo = modelo;
		modelo.addPropertyChangeListener(modelo.getPropertyChangeCambio(), 
				new PropertyChangeListener(){
					@SuppressWarnings("unchecked")
					@Override
					public void propertyChange(PropertyChangeEvent evt) {
						actualizarCampos((Entity)evt.getNewValue());
					}
		});
	}

	@Override
	public void update(Observable observable, Object object) {
		if (observable!= null)
			if(object != null){
				if(Modelo.INSERTAR.equalsIgnoreCase(String.valueOf(object))) {
					iniciarCampos();
					habilitarTextField(true);
				} else if(Modelo.MODIFICAR.equalsIgnoreCase(String.valueOf(object))) {
					habilitarTextField(true);
				} else if(Modelo.BORRAR.equalsIgnoreCase(String.valueOf(object))) {
					habilitarTextField(false);
					Mensajeria.mensajeInformacion(this, "Borrado", "La entidad fue borrada exitosamente");
				} else if(Modelo.GUARDAR.equalsIgnoreCase(String.valueOf(object))) {
					habilitarTextField(false);
					getController().guardar(actualizarDomain((Entity) 
							getController().getModelo().getTablaModel().getSeleccionado()));
				} else if(Modelo.GUARDADO.equalsIgnoreCase(String.valueOf(object))) {
					Mensajeria.mensajeInformacion(this, "Guardar", "La Entidad se guardo correctamente");
				} else if(Modelo.CANCELAR.equalsIgnoreCase(String.valueOf(object))) {
					modelo.getTablaModel().actualizarTabla();
					getController().getModelo().getTablaModel().seleccionaPrimero();
					habilitarTextField(false);
				}
				actualizarTabla();
				validate();
				repaint();
			}
	}
	
	protected abstract Controller<Entity> getController();
	
	protected abstract void actualizarTabla();

	protected abstract void actualizarCampos(Entity entity);

	protected abstract void iniciarCampos();

	protected abstract void habilitarTextField(boolean habilitar);
	
	protected abstract Entity actualizarDomain(Entity entity);
}
